Sierpinski animationΒΆ

#!/usr/bin/env python

import turtle

def draw_triangle(points, color, t):
    t.fillcolor(color)
    t.up()
    t.goto(points[0][0],points[0][1])
    t.down()
    t.begin_fill()
    t.goto(points[1][0], points[1][1])
    t.goto(points[2][0], points[2][1])
    t.goto(points[0][0], points[0][1])
    t.end_fill()

def get_mid(p1, p2):
    return ((p1[0] + p2[0]) / 2, (p1[1] + p2[1]) / 2)

def sierpinski(points, degree, turt):
    color_map = ['violet', 'yellow', 'white', 'green', 'red',
                'blue', 'orange']
    draw_triangle(points, color_map[degree], turt)
    if degree > 0:
        # left
        sierpinski([points[0],
                    get_mid(points[0], points[1]),
                    get_mid(points[0], points[2])],
                    degree-1, turt)
        # top
        sierpinski([points[1],
                    get_mid(points[0], points[1]),
                    get_mid(points[1], points[2])],
                    degree-1, turt)
        # right
        sierpinski([points[2],
                    get_mid(points[2], points[1]),
                    get_mid(points[0], points[2])],
                    degree-1, turt)

def main():
    turt = turtle.Turtle()
    my_win = turtle.Screen()
    my_points = [[-200, -150],
                 [0, 200],
                 [200, -150]]
    sierpinski(my_points, 5, turt)
    my_win.exitonclick()

if __name__ == "__main__":
    main()
    mainloop()